有學過計算機概論應該都知道 RAM 的存取效率遠高於硬碟的效率 。
ElastiCache 是以記憶體為快取,改善網路應用程式的效能,避免頻繁存取較低速的硬碟資源。
ElastiCache 主要有分 Lazy-loading 和 Write-Through 兩種。
以下整理一個表格來說明 Lazy-loading 和 Write-Through 效益與做法以及使用時機:
Lazy-Loading | Write-Through |
---|---|
當有人索取資料才會寫入 Cache | 資料寫入資料庫時,同時寫入 Cache 中 |
第一次提取會比較慢 | 提取速度快 |
記憶體用量較少 | 記憶體用量大 |
第一次查詢資料會比較久屬於被動型的快取資料,有可能會存取到舊資料 | 快取會放很多不一定會被使用到的資料。寫入資料的成本增加,因為必須多寫一份到 Cache |
但是不見得一定要選邊站一定只能選擇其中一種,我也可以先用 Write-Through 將資料寫入 Cache 裡面,若超過某個時間閥值 (例如三個小時或是一天) 就將資料從 Cache 中移除,當有資料需要查詢的時候,再用 Lazy-loading 的機制寫入 Cache 資料庫,讓 Cache 的儲存成本最佳化。
提供兩種引擎格式: Memcached 、 Redis
兩種都擁有: 毫秒等級的延遲、資料分割以及支援各種程式語言。
Memcached 屬於 Muti-Thread 架構 ,相較於 Redis 比較老一點。
Redis 屬於 單線程架構,擁有比 Memcached 更多的功能:
適用於對資料有複雜操作 (排序、計算)的應用場景 類似於記憶體上的資料庫。
使用前需定義 Subnet Group ,在 Subnet 裡面會開啟 Node ,在 Node 裡面會用到多個 Shard ,資料會存在 Shard 裡面。
Redis 在叢集模式下會將資料拆成多份,分別存在多個 Node 裡面,提升讀取效率與可用性,被拆分的資料稱為 Shard 。 我們也可以針對 Shard 去做 Snapshot。
Subnet Group 是 VPC 的 Subnet 的集合。
跟 RDS 一樣,如果需要調教效能,可以使用 Parameter Group 調整參數。
適用於 對不需要針對緩存資料在進行處理的應用場景 ,例如資料庫查詢結果快取
Memcached 的系統結構就不像 Redis 那麼像資料庫。但是它也是可以做成叢集,也可分散 Node。
各個 Node 之間的資料也不會互相同步,讀取資料的時候可能會找錯 Node。
資料分散的方式也 不具容錯機制 ,所以會有 資料遺失 的問題。
例如以下案例的 Data 4 會因為最下面的節點掛掉導致資料遺失。
關於 不具容錯機制會有資料遺失 這點,官方給的解決方法是 多開節點 。節點越多,各個節點上的資料就越少,節點遺失造成的損失也相對較小。
Memcached 還有另外一個問題, 讀取資料的時候可能會找錯 Node 。這個問題則可以透過 Auto Discovery 來自動探勘到正確的 Node 上。